#coding=utf-8
#!/usr/bin/python
"""
非阻塞socket


#     cd /d D:\python26 
#     python.exe D:\py\demo\sock_s.py

#       python.exe  .\dev_test\sock_s.py

"""
import os,sys,time

import socket ,select
#信号处理
import signal



##################
def signal_do(signum, frame):
    u" 信号处理 "
    print "signal is ",signum
    print frame
    exit()

signal.signal(signal.SIGINT,signal_do)





if __name__ == '__main__':  
    lis_add = '0.0.0.0'
    lis_port = 800




    
    # AF_INET(Internet地址 ) 和 AF_UNIX(SOCK的文件)
    # SOCK_STREAM(流套接字)  和 SOCK_DGRAM(数据报套接字)

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  


    sock.bind((lis_add, lis_port))  
    #最多允许 3 个客户连接到服务器
    sock.listen(2)  
    

    
    while True:  



                    
        #accept方法等待客户请求一个连接
        #  连入就分开了
        connection,address = sock.accept()  
        print address
        try:  
            #等待 超时间
            connection.settimeout(5)  
            loop = 2 #循环次数
            while 1:
                
                #--------非阻塞  使用 select
                #原型 select.select(rlist, wlist, xlist[, timeout]) 三个list，包含三个已经准备好的fd(文件描述符)列表
                
                in_fds,out_fds,err_fds = select.select([connection],[],[])


                
                buf = connection.recv(1024)  
                #合理数据
                if buf:  
                    #send和recv方法(发送，接受)
                    connection.send('welcome to server!')
                    connection.send(buf)
                else:
                    connection.close() 
                    break 
        except socket.error:  
            #print e
            print socket.timeout
            print socket.error
        
        
        #关闭网络    
        sock.close()
        print 'exit'
        time.sleep(4)
        print __file__ ,':the end'
        sys.exit()
            